package com.hopedove.net;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener;

public class RespParseUtil {
    // 有两种 FLAG 字段
    private static final String KEY_FLAG_1 = "OPT_FLAG";
    private static final String KEY_FLAG_2 = "FLAG";

    // 有两种 Message 字段
    private static final String KEY_MESSAGE_1 = "MSG_INFO";
    private static final String KEY_MESSAGE_2 = "ERRORMESSAGE";


    public static String getMessage(JSONObject jsonObject) {
        try {
            if (jsonObject.has(KEY_MESSAGE_1)) {
                return jsonObject.getString(KEY_MESSAGE_1);
            } else if (jsonObject.has(KEY_MESSAGE_2)) {
                return jsonObject.getString(KEY_MESSAGE_2);
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static boolean hasFlagField(JSONObject jsonObject) {
        return jsonObject.has(KEY_FLAG_1) || jsonObject.has(KEY_FLAG_2);
    }

    public static Object getFlagValue(JSONObject jsonObject) {
        if (!hasFlagField(jsonObject)) {
            return null;
        }

        try {
            Object val = null;
            if (jsonObject.has(KEY_FLAG_1)) {
                val = jsonObject.get(KEY_FLAG_1);
            } else {
                val = jsonObject.get(KEY_FLAG_2);
            }

            return val;
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static boolean isResponseOk(JSONObject jsonObject) {
        // 服务返回的 opt_flag 有几种情况，
        // int 类型，0 表示成功， 其它数字表示错误
        // string 类型，其中又分，一种是 SUCCESS 表示成功，另一种是字符串但是内容是数字 "0","1"... 等，但意思和 int 类型一致。
        // 直接返回数据，不含成功或失败的标识，比如 生产模块会返回 [{},{},{}] 这种数据

        // 1. 退沙 - 查询机台， 返回的成功的响应中不含 FLAG 字段， 所以如果响应是 JSON，但没有 FLAG 字段，默认也是成功的。
        if (hasFlagField(jsonObject)) {

            Object val = getFlagValue(jsonObject);

            if (val instanceof Integer) {
                int valInt = (int) val;
                return valInt == 0;
            } else {
                String valStr = ((String) val).trim();
                if (valStr.length() < 3) {
                    int valInt = Integer.parseInt(valStr);
                    return valInt == 0;
                } else {
                    return "SUCCESS".equals(valStr);
                }
            }
        }

        return true;
    }

    public static boolean isJsonArray(String resp) {
        try {
            Object json = new JSONTokener(resp).nextValue();
            return json instanceof JSONArray;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;
    }

    public static boolean isJsonObject(String resp) {
        try {
            Object json = new JSONTokener(resp).nextValue();
            return json instanceof JSONObject;
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;
    }
}
